// Individual node implementations
// Module declarations (unfortunately must be manual due to Rust's module system)
pub(crate) mod abs;
pub(crate) mod add;
pub(crate) mod argmax;
pub(crate) mod argmin;
pub(crate) mod attention;
pub(crate) mod avg_pool1d;
pub(crate) mod avg_pool2d;
pub(crate) mod batch_norm;
pub(crate) mod bernoulli;
pub(crate) mod bitshift;
pub(crate) mod bitwiseand;
pub(crate) mod bitwisenot;
pub(crate) mod bitwiseor;
pub(crate) mod bitwisexor;
pub(crate) mod bool_and;
pub(crate) mod bool_or;
pub(crate) mod bool_xor;
pub(crate) mod cast;
pub(crate) mod ceil;
pub(crate) mod clip;
pub(crate) mod concat;
pub(crate) mod constant;
pub(crate) mod constant_of_shape;
pub(crate) mod conv1d;
pub(crate) mod conv2d;
pub(crate) mod conv3d;
pub(crate) mod conv_transpose_1d;
pub(crate) mod conv_transpose_2d;
pub(crate) mod conv_transpose_3d;
pub(crate) mod cos;
pub(crate) mod cosh;
pub(crate) mod depth_to_space;
pub(crate) mod div;
pub(crate) mod dropout;
pub(crate) mod equal;
pub(crate) mod erf;
pub(crate) mod exp;
pub(crate) mod expand;
pub(crate) mod eye_like;
pub(crate) mod flatten;
pub(crate) mod floor;
pub(crate) mod gather;
pub(crate) mod gather_elements;
pub(crate) mod gelu;
pub(crate) mod gemm;
pub(crate) mod global_avg_pool;
pub(crate) mod greater;
pub(crate) mod greater_equal;
pub(crate) mod group_norm;
pub(crate) mod hard_sigmoid;
pub(crate) mod identity;
pub(crate) mod if_node;
pub(crate) mod instance_norm;
pub(crate) mod is_inf;
pub(crate) mod is_nan;
pub(crate) mod layer_norm;
pub(crate) mod leaky_relu;
pub(crate) mod linear;
pub(crate) mod log;
pub(crate) mod log_softmax;
pub(crate) mod loop_node;
pub(crate) mod lower;
pub(crate) mod lower_equal;
pub(crate) mod matmul;
pub(crate) mod matmul_integer;
pub(crate) mod max_pair;
pub(crate) mod max_pool1d;
pub(crate) mod max_pool2d;
pub(crate) mod mean;
pub(crate) mod min_pair;
pub(crate) mod modulo;
pub(crate) mod mul;
pub(crate) mod neg;
pub(crate) mod nonzero;
pub(crate) mod not;
pub(crate) mod one_hot;
pub(crate) mod pad;
pub(crate) mod pow;
pub(crate) mod prelu;
pub(crate) mod random_normal;
pub(crate) mod random_normal_like;
pub(crate) mod random_uniform;
pub(crate) mod random_uniform_like;
pub(crate) mod range;
pub(crate) mod reciprocal;
pub(crate) mod reduce;
pub(crate) mod relu;
pub(crate) mod reshape;
pub(crate) mod resize;
pub(crate) mod round;
pub(crate) mod scan_node;
pub(crate) mod shape;
pub(crate) mod sigmoid;
pub(crate) mod sign;
pub(crate) mod sin;
pub(crate) mod sinh;
pub(crate) mod size;
pub(crate) mod slice;
pub(crate) mod softmax;
pub(crate) mod space_to_depth;
pub(crate) mod split;
pub(crate) mod sqrt;
pub(crate) mod squeeze;
pub(crate) mod sub;
pub(crate) mod sum;
pub(crate) mod tan;
pub(crate) mod tanh;
pub(crate) mod tile;
pub(crate) mod top_k;
pub(crate) mod transpose;
pub(crate) mod trilu;
pub(crate) mod unsqueeze;
pub(crate) mod where_op;

// Node registry, codegen traits, and utilities are in parent module
// Re-export them here for backward compatibility
pub(crate) use super::node_registry::*;
pub(crate) use super::node_traits::{
    NodeCodegen, OnnxIntoNode, SerializationBackend, extract_node_data,
};

#[cfg(test)]
pub(crate) use super::node_test as test;
